@echo off
chcp 65001 > nul
setlocal enabledelayedexpansion

:: 显示欢迎信息
cls
echo 欢迎使用 LuckDog 工具箱
echo.

:main_menu
:: 确保显示正确的编码
chcp 65001 > nul
cls
:: 显示菜单
echo 请选择要执行的操作:
echo -----------------------------
echo  1. 构建项目
echo  2. 运行测试
echo  3. 运行测试覆盖率
echo  4. 升级版本
echo  5. 发布到 NPM
echo  0. 退出
echo -----------------------------
echo.
set /p choice=请输入选项编号:

:: 根据选择执行相应操作
if "%choice%"=="0" (
    echo Bye ~
    goto :eof
) else if "%choice%"=="1" (
    echo 正在构建项目...
    call npm run build
    goto :finish
) else if "%choice%"=="2" (
    echo 正在运行测试...
    call npm run test
    goto :finish
) else if "%choice%"=="3" (
    echo 正在运行测试覆盖率...
    call npm run test:coverage
    goto :finish
) else if "%choice%"=="4" (
    goto :version_management
) else if "%choice%"=="5" (
    goto :publish_npm
) else (
    echo 无效的选项，请重新运行脚本并选择正确的选项。
    goto :finish
)

:finish
echo.
echo 操作完成!
pause
goto :main_menu

:version_management
    :: 确保显示正确的编码
    chcp 65001 > nul
    cls
    echo 版本管理选项:
    echo -----------------------------
    echo  1. 升级修订号 (patch) - 例如: 1.0.0 → 1.0.1
    echo  2. 升级次版本 (minor) - 例如: 1.0.0 → 1.1.0
    echo  3. 升级主版本 (major) - 例如: 1.0.0 → 2.0.0
    echo  4. 创建预发布版本
    echo  5. 返回主菜单
    echo  0. 退出
    echo -----------------------------
    echo.
    set /p ver_choice=请输入选项编号:

    if "%ver_choice%"=="0" (
        echo Bye ~
        goto :eof
    ) else if "%ver_choice%"=="1" (
        echo 正在升级修订号...
        call npm version patch
        goto :finish
    ) else if "%ver_choice%"=="2" (
        echo 正在升级次版本...
        call npm version minor
        goto :finish
    ) else if "%ver_choice%"=="3" (
        echo 正在升级主版本...
        call npm version major
        goto :finish
    ) else if "%ver_choice%"=="4" (
        goto :prerelease_version
    ) else if "%ver_choice%"=="5" (
        goto :main_menu
    ) else (
        echo 无效的选项
        goto :finish
    )

:prerelease_version
    :: 确保显示正确的编码
    chcp 65001 > nul
    cls
    echo 请选择预发布类型:
    echo -----------------------------
    echo  1. alpha
    echo  2. beta
    echo  3. rc (Release Candidate)
    echo  0. 返回
    echo -----------------------------
    echo.
    set /p pre_type=请输入预发布类型编号:
    
    if "%pre_type%"=="0" (
        goto :version_management
    )
    
    set "pre_tag="
    if "%pre_type%"=="1" set "pre_tag=alpha"
    if "%pre_type%"=="2" set "pre_tag=beta"
    if "%pre_type%"=="3" set "pre_tag=rc"
    
    if not defined pre_tag (
        echo 无效的预发布类型
        goto :version_management
    )
    
    echo 请输入预发布版本号(例如: 0, 1, 2...):
    set /p pre_num=预发布版本号:
    
    :: 获取当前版本
    for /f "tokens=2 delims=:, " %%a in ('findstr /C:"\"version\"" package.json') do (
        set curr_version=%%~a
        set curr_version=!curr_version:"=!
    )
    
    :: 从当前版本提取主要部分
    for /f "tokens=1,2,3 delims=.-" %%a in ("!curr_version!") do (
        set "ver_major=%%a"
        set "ver_minor=%%b"
        set "ver_patch=%%c"
    )

    set "next_version=!ver_major!.!ver_minor!.!ver_patch!-!pre_tag!.!pre_num!"
    echo 升级后版本: !next_version!
    
    set /p confirm=是否确认创建预发布版本? (y/n): 
    if /i "%confirm%"=="y" (
        echo 正在创建预发布版本...
        call npm version !next_version!
    ) else (
        echo 已取消升级操作
    )
    goto :finish

:publish_npm
    :: 确保显示正确的编码
    chcp 65001 > nul
    cls
    echo ===================================
    echo    LuckDog NPM发布助手
    echo ===================================

    :: 检查是否已登录npm
    echo 检查npm登录状态...
    call npm whoami > nul 2>&1
    if %ERRORLEVEL% NEQ 0 (
      echo 您尚未登录npm，将开始登录流程...
      call npm login
      if %ERRORLEVEL% NEQ 0 (
        echo npm登录失败，请稍后重试。
        goto :publish_error
      )
    )

    :: 检查是否有未提交的更改
    echo.
    echo 确保项目能正常构建...
    call npm install
    if %ERRORLEVEL% NEQ 0 (
      echo 依赖安装失败，请检查网络连接并重试。
      goto :publish_error
    )

    :: 运行测试
    echo.
    echo 运行测试...
    call npm test
    if %ERRORLEVEL% NEQ 0 (
      echo 测试未通过，请修复测试问题后再发布。
      goto :publish_error
    )

    :: 构建项目
    echo.
    echo 构建项目...
    call npm run build
    if %ERRORLEVEL% NEQ 0 (
      echo 构建失败，请修复错误后再发布。
      goto :publish_error
    )

    :: 读取当前版本号
    for /f "tokens=2 delims=:, " %%a in ('findstr /C:"\"version\"" package.json') do (
      set version=%%~a
      set version=!version:"=!
    )
    echo.
    echo 当前版本号: !version!

    :: 检查是否为预发布版本
    echo !version! | findstr /R "alpha\|beta\|rc" > nul
    if %ERRORLEVEL% EQU 0 (
        echo 检测到预发布版本，将使用标签发布
        set "publish_tag=--tag"
        
        if "!version!" == "!version:alpha=!" (
            set "publish_tag=!publish_tag! alpha"
        ) else if "!version!" == "!version:beta=!" (
            set "publish_tag=!publish_tag! beta"
        ) else if "!version!" == "!version:rc=!" (
            set "publish_tag=!publish_tag! rc"
        )
        
        echo 发布标签: !publish_tag!
    ) else (
        set "publish_tag="
    )

    :: 确认发布
    echo.
    set /p confirm=是否要发布版本 !version! 到npm? (y/n): 
    if /i not "%confirm%"=="y" goto :publish_end

    :: 执行发布
    echo.
    echo 正在发布到npm...
    if defined publish_tag (
        call npm publish !publish_tag!
    ) else (
        call npm publish
    )
    
    if %ERRORLEVEL% NEQ 0 (
      echo 发布失败，请查看错误信息并解决。
      goto :publish_error
    )

    echo.
    echo ===================================
    echo 发布成功！
    echo 您可以通过以下命令检查包信息：
    echo npm view luckdog
    echo ===================================
    goto :publish_end

:publish_error
    echo.
    echo 发布过程中出现错误，操作已终止。
    echo 请查看上述错误信息，修复问题后重试。

:publish_end
    goto :finish 